﻿using System;
using DimensionsHelper.Common.Contracts.Excel.Options;
using DimensionsHelper.Common.TableFormatter;

namespace DimensionsHelper.Common.Contracts.TableFormatter.Options;

[Serializable]
public class MenuOptions
{
    /// <summary>
    ///     指定是否添加目录Sheet
    /// </summary>
    public bool BuildMenu { get; set; } = true;

    /// <summary>
    ///     指定目录类型：
    ///     <see cref="MenuType.Regular" /> - 添加LinkSheet和IndexSheet；
    ///     <see cref="MenuType.SingleLinkSheet" /> - 只添加LinkSheet，详细内容全部列在LinkSheet中；
    /// </summary>
    public MenuType MenuType { get; set; } = MenuType.Regular;

    /// <summary>
    ///     LinkSheet名，
    ///     <see cref="MenuType.Regular" /> - 此目录指向IndexSheet中的不同列；
    ///     <see cref="MenuType.SingleLinkSheet" /> - 此目录指向具体的内容Sheet；
    /// </summary>
    public string LinkSheetName { get; set; } = TableFormatterDefaultValues.MenuLinkSheetName;

    /// <summary>
    ///     IndexSheet名，
    ///     <see cref="MenuType.Regular" /> - 此目录指向具体内容Sheet；
    ///     <see cref="MenuType.SingleLinkSheet" /> - 不添加此Sheet；
    /// </summary>
    public string IndexSheetName { get; set; } = TableFormatterDefaultValues.MenuIndexSheetName;

    /// <summary>
    ///     是否在目录中添加具体内容的Section标签内容
    /// </summary>
    public bool ShowSection { get; set; }

    /// <summary>
    ///     目录中Section标签单元格样式，只有在<see cref="ShowSection" />为true时才有用。
    /// </summary>
    public RangeStyleOptions SectionStyleOptions { get; set; } = new TableOptions();

    /// <summary>
    ///     是否合并Section所在行的单元格，只会合并当前内容Sheet涉及到的目录列，只有在<see cref="ShowSection" />为true时才有用。
    /// </summary>
    public bool MergeSection { get; set; }

    /// <summary>
    ///     是否在目录添加出示Base数据的列。
    /// </summary>
    public bool ShowBase { get; set; }

    /// <summary>
    ///     当表格包含多个符合条件的Base行时，是否全部出示。
    /// </summary>
    public bool ShowMultiBase { get; set; }

    /// <summary>
    ///     是否将多个Base行输出在同一个单元格内，只有在<see cref="ShowMultiBase" />为true时才有用。
    /// </summary>
    public bool ShowMultiBaseInOneCell { get; set; }

    /// <summary>
    ///     读取表格Base行的列号，最小值为2。
    /// </summary>
    public int BaseValueColumn { get; set; } = TableFormatterDefaultValues.BaseColumn;

    /// <summary>
    ///     出示Base数据时使用的内容格式，其中{0}为具体数据，{1}为文本描述，此文本不包含Base特征前缀。
    /// </summary>
    public string BaseContentFormat { get; set; } = TableFormatterDefaultValues.BaseContentFormat;

    /// <summary>
    ///     出示Base数据时添加的单元格样式。
    /// </summary>
    public RangeStyleOptions BaseStyleOptions { get; set; } = new TableOptions();

    /// <summary>
    ///     是否隐藏第一列的表格计数，如果此值为false，超链接将添加在计数上；如果此值为true，超链接将添加在标题上。
    /// </summary>
    public bool HideNumber { get; set; }

    /// <summary>
    ///     <see cref="LinkSheetName" />中A1单元格中的文本内容。
    /// </summary>
    public string LinkSheetLabel { get; set; } = TableFormatterDefaultValues.MenuLinkSheetLabel;

    /// <summary>
    ///     <see cref="LinkSheetName" />中A1单元格样式。
    /// </summary>
    public RangeStyleOptions LinkSheetLabelStyleOptions { get; set; } = new TableOptions();

    /// <summary>
    ///     <see cref="LinkSheetName"/> 中Sheet名列的单元格样式。
    /// </summary>
    public RangeStyleOptions LinkSheetSheetNameStyleOptions { get; set; } = new TableOptions();

    /// <summary>
    ///     返回超链接的文本内容，默认是 Back。
    /// </summary>
    public string BackText { get; set; } = TableFormatterDefaultValues.MenuBackText;

    /// <summary>
    ///     返回超链接单元格样式。
    /// </summary>
    public RangeStyleOptions BackStyleOptions { get; set; } = new TableOptions();

    /// <summary>
    ///     Sheet描述单元格样式。
    /// </summary>
    public RangeStyleOptions SheetLabelStyleOptions { get; set; } = new TableOptions();

    /// <summary>
    ///     Sheet描述后的空白行数，只有在<see cref="MenuType" />是<see cref="MenuType.Regular" />是才有效。
    /// </summary>
    public int EmptyRowsFollowSheetLabel { get; set; } = TableFormatterDefaultValues.EmptyRowsFollowSheetLabel;

    /// <summary>
    ///     表格描述单元格样式。
    /// </summary>
    public RangeStyleOptions TableLabelStyleOptions { get; set; } = new TableOptions();

    /// <summary>
    ///     表格基数单元格样式。
    /// </summary>
    public RangeStyleOptions TableNumberStyleOptions { get; set; } = new TableOptions();
}